// 学习不定参宏函数的使用

#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__);

//C语言中不定参函数的使用，不定参数据的访问
void printNum(int count, ...)
{
    va_list ap;
    va_start(ap, count); // 获取指定参数（count）之后第一个参数的起始地址，也就是获取不定参（...）的起始地址
    for (int i = 0; i < count; ++i)
    {
        int num = va_arg(ap, int);//根据不定参的起止地址获取对应类型的参数，之后会自动偏移指针到下一个参数的起始位置
        printf("param[%d]:%d\n", i, num);
    }
    va_end(ap);//将ap置空
}

void myprintf(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt); // 获取指定参数（fmt）之后第一个参数的起始地址，也就是获取不定参（...）的起始地址
    char *res;
    int ret = vasprintf(&res, fmt, ap);//按照格式化字符串（fmt）将不定参格式化成指定字符串存入指针res所指向的空间当中
    if (ret != -1)//通过返回值判断是否成功
    {
        printf(res);
        free(res);//使用完后记得将其置空避免野指针问题
    }
    va_end(ap);//将ap置空
}

int main()
{
    // LOG("%s-%d\n", "日志系统", 1);
    LOG("日志系统\n");
    printNum(2, 666, 777);
    printNum(5, 1, 2, 3, 4, 5);
    myprintf("%s-%d\n", "日志系统", 1);
    myprintf("日志系统\n");
    return 0;
}